package dwdm;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Ficheros {

    /* El único método público para esta clase estática es el llamado
     * procesarFicheros, que recibe una cadena con la ruta completa y el nombre
     * del archivo a procesar (extensión .csv).
     * Este método es el encargado de invocar a los otros tres métodos, que
     * generarán la información del archivo, el apartado RELATIONS y el apartado
     * DATA. Cada uno de estos apartados los genera a partir de sus respectivos
     * ficheros. El que contiene la información está identificado por el prefijo
     * "i-" y el que contiene las relaciones por el prefijo "c-".     *
     */
    public static void procesarFicheros(String archivo) throws FileNotFoundException, IOException {
        File ficResultado = new File(archivo.replace(".csv", ".arff"));
        BufferedWriter bw = new BufferedWriter(new FileWriter(ficResultado));
        int campos;

        procesarInformacion(bw, archivo);
        campos = procesarCabeceras(bw, archivo);
        procesarDatos(bw, archivo, campos);

        bw.close();
    }

    private static void procesarInformacion(BufferedWriter bw, String archivo) throws FileNotFoundException, IOException {
        String linea;
        File f = new File(archivo);
        String nombre = "i-" + f.getName();

        String archivoInf = archivo.replace(f.getName(), nombre);
        File ficInformacion = new File(archivoInf);

        FileReader fr = new FileReader(ficInformacion);
        BufferedReader bf = new BufferedReader(fr);
        while ((linea = bf.readLine()) != null) {
            bw.write("%" + linea + "\n");
        }
        bw.write("\n");
        fr.close();
    }

    private static int procesarCabeceras(BufferedWriter bw, String archivo) throws FileNotFoundException, IOException {
        String linea;
        int campos = 0;
        File f = new File(archivo);
        String nombre = "c-" + f.getName();

        String archivoCab = archivo.replace(f.getName(), nombre);
        File ficCabecera = new File(archivoCab);

        FileReader fr = new FileReader(ficCabecera);
        BufferedReader bf = new BufferedReader(fr);

        bw.write("@RELATION " + f.getName() + "\n\n");
        while ((linea = bf.readLine()) != null) {
            String[] datos = linea.split(";");
            bw.write("@ATTRIBUTE ");
            bw.write(datos[0] + "\t");
            String[] valores = datos[1].split(",");
            if(valores.length>1){
                bw.write("{" + datos[1] + "}\n");
            } else {
                bw.write(datos[1] + "\n");
            }
            campos++;
        }
        bw.write("\n");
        fr.close();
        return (campos);
    }

    private static void procesarDatos(BufferedWriter bw, String archivo, int campos) throws FileNotFoundException, IOException {
        String linea, l;
        File ficDatos = new File(archivo);

        FileReader fr = new FileReader(ficDatos);
        BufferedReader bf = new BufferedReader(fr);

        bw.write("@DATA" + "\n\n");

        while ((linea = bf.readLine()) != null) {
            String[] datos = linea.split(";");
            l = "";
            for (int i = 0; i < campos; i++) {
                if (datos[i].contains(" ")) {
                    datos[i] = "\"" + datos[i] + "\"";
                }
                if (i == campos - 1) {
                    l += datos[i] + "\n";
                } else {
                    l += datos[i] + ",";
                }
            }
            bw.write(l);
        }
        fr.close();
    }

    private static String eliminarAcentos(String cadena) {
        cadena = cadena.replace('á', 'a');
        cadena = cadena.replace('é', 'e');
        cadena = cadena.replace('í', 'i');
        cadena = cadena.replace('ó', 'o');
        cadena = cadena.replace('ú', 'o');
        cadena = cadena.replace('Á', 'A');
        cadena = cadena.replace('É', 'E');
        cadena = cadena.replace('Í', 'I');
        cadena = cadena.replace('Ó', 'O');
        cadena = cadena.replace('Ú', 'U');
        cadena = cadena.replace('ñ', 'n');
        cadena = cadena.replace('N', 'N');
        cadena = cadena.replace('ü', 'u');
        cadena = cadena.replace('Ü', 'U');

        return (cadena);
    }
}
